// AduHandler

// PduHandler

#include <stddef.h>
#include <stdint.h>


/** 为了便于使用，对字节数组缓冲区的封装类
 *
 * 一个ByteBuffer 对象应该被视为缓冲区的持有者，而不只是一个传递指针的简单容器。
 * ByteBuffer 可被复制，ByteBuffer 拷贝的拥有者都自动获得缓冲区的读写使用权。
 *
 * 底层缓冲区的生命周期管理由其创建者负责。比如，主程序初始化两个缓冲区A、B，及对应的ByteBuffer 对象，
 * 之后所有使用缓冲区的地方都用ByteBuffer 代替，最后由主程序销毁A，B。
 *
 */
class ByteBuffer {
   private:
    uint8_t *_buffer;  // 指向buffer 内存的指针。不应该修改这个指针，如果需要变更缓冲区，应该交换或变更整个ByteBuffer 对象。
    size_t _size;      // buffer 的最大可用空间
    size_t _pos;       // 当前读写位置，在传递ByteBuffer 对象时，用这个参数确定缓冲区中已被写入多少个字节

   public:
    ByteBuffer(uint8_t *buffer_ptr, size_t max_size) :
        _buffer(buffer_ptr), _size(max_size) {}


    uint8_t *buffer() const {
        return _buffer;
    }

    size_t size() const {
        return _size;
    }

    size_t pos() const {
        return _pos;
    }

    void set_pos(size_t p) {
        _pos = p;
    }

    uint8_t &operator[](size_t i) const {
        return _buffer[i];
    }
};


class TransmissionContext {
};


class SerialClient : TransmissionContext {
};


class SerialServer : TransmissionContext {
};


template <typename Context>
class AduBase {
   public:
    virtual before_session_init(Context &c) {
    }
};


///////////////////////


class IAduHandler {
   public:
};


void main() {
    SeriralBackend bknd{uart_baud::n9600, uart_format::b8n1};


    PduHandler ph{bknd};

    // AduHandler ah{...};

    // SerialServer s{ah, ph};
    SerialClient c{ah, ph};
}


/////////////////////////////////////////////////
